05 - 文件系统式记忆
前置:02 篇的抽取式写入、04 篇的检索管线。本篇是这两篇的替代路线。
本篇回答:不建向量库、不建图库,让模型自己读写一个目录,能走多远。
本篇会用到的词:
| 词 | 意思 |
|---|---|
| 客户端执行工具 | 模型只发出操作请求,实际执行在你的应用里。文件读写、路径校验都是你的代码在做 |
| 即时检索(just-in-time) | 不预先把所有相关信息塞进上下文,而是让模型在需要时自己去读。文件式记忆的核心主张 |
| memFS | Letta 对"记忆文件系统"的叫法,其记忆是一个 git 仓库而不是数据库表 |
| 记忆块(memory block) | Letta v1 的记忆单元:一段带标签的文本,常驻在系统提示词里 |
| 路径穿越 | 用 ../ 之类的相对路径跳出限定目录,读到不该读的文件 |
一、这条路线的主张
前四篇里的记忆层有一个共同结构:系统替模型决定该记什么、该取回什么。抽取器挑事实、检索器挑条目,模型只是被动接 收结果。
文件式记忆把这个决策权交回给模型:给它一个目录和六个文件操作,让它自己决定写什么文件、什么时候去读。
view 目录、view 文件、可能再 view 另一个文件,每一步都是一次完整的模型往返。二、Anthropic memory 工具
工具声明只有两个字段,没有 input_schema —— 输入格式内置在模型里:
{"type": "memory_20250818", "name": "memory"}
2.1 六个命令
| 命令 | 参数 | 行为 | 需要注意的错误语义 |
|---|---|---|---|
view | path,可选 view_range | 目录返回两层深的列表(大小 + 路径,tab 分隔);文件返回带 6 位右对齐行号的内容 | 空目录的第一次 view 不是错误。超过 16,000 字符的文件会被截断,模型会跟一次带 view_range 的读 |
create | path, file_text | 建文件,已存在则覆盖 | 覆盖前应自己留备份 —— 协议不负责 |
str_replace | path, old_str,可选 new_str | 替换唯一一处;省略 new_str 即删除该段 | old_str 出现 0 次或多次都必须报错并说明,不能自作主张替换第一处 |
insert | path, insert_line, insert_text | 插到第 insert_line 行之后,0 表示插到开头 | 行号越界要返回带合法区间的错误信息 |
delete | path | 递归删除文件或目录 | 必须拒绝删除 /memories 根目录本身 |
rename | old_path, new_path | 重命名或移动 | 目标已存在时报错,不要覆盖 |
str_replace 那条"多处匹配必须报错"看着琐碎,实际是这套协议里最重要的一条安全设计:模型对文件内容的记忆是不精确的,它以为唯一的字符串常常出现多次。静默替换第一处会造成难以察觉的记忆损坏。